package com.wutong.resonance.model.plugin.drawer;

import com.wutong.resonance.model.audio.AudioParams;
import com.wutong.resonance.model.audio.tool.AudioFile;
import com.wutong.resonance.model.plugin.IPlugin;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import lombok.Getter;
import lombok.Setter;

/**
 * 音频文件可视化插件
 * <p>
 * 该抽象类定义了音频文件可视化插件的基础结构和通用方法。 它实现了 {@link IPlugin} 接口，并提供了画布（Canvas）和图形上下文（GraphicsContext）用于绘制音频数据。
 * <p>
 * 子类需要实现 {@link #draw(AudioFile)} 方法来完成实际的音频数据绘制逻辑。
 *
 * @author mcht1
 * @since 1.0.0
 */
@Getter
@Setter
public abstract class DrawerPlugin implements IPlugin {

    /**
     * 插件名称
     */
    private String pluginName;

    /**
     * 插件描述
     */
    private String pluginDesc;

    /**
     * 父容器，用于承载插件的画布
     */
    protected Pane parent;

    /**
     * 画布，用于绘制音频数据
     */
    protected Canvas canvas;

    /**
     * 图形上下文，用于在画布上进行绘制
     */
    protected GraphicsContext gc;

    /**
     * 波形颜色，用于绘制波形
     */
    protected Color waveformColor = Color.LIGHTGREEN;

    /**
     * 背景颜色，用于填充画布背景
     */
    protected Color backgroundColor = Color.BLACK;

    protected AudioParams audioParams;

    /**
     * 构造方法，创建一个新的 {@code DrawerPlugin} 实例。
     *
     * @param pluginName 插件名称。
     * @param pluginDesc 插件描述。
     * @param parent     父容器，用于承载插件的画布。
     */
    public DrawerPlugin(String pluginName, String pluginDesc, Pane parent) {
        this.pluginName = pluginName;
        this.pluginDesc = pluginDesc;
        this.parent = parent;
        this.canvas = new Canvas(parent.getWidth(), parent.getHeight());
        this.gc = canvas.getGraphicsContext2D();

        init();
    }

    /**
     * 初始化插件，绑定画布大小到父容器，并将画布添加到父容器中。
     */
    @Override
    public void init() {
        canvas.widthProperty().bind(parent.widthProperty());
        canvas.heightProperty().bind(parent.heightProperty());
        parent.getChildren().add(canvas);
    }

    /**
     * 关闭插件，从父容器中移除画布，并解绑画布大小属性。
     */
    @Override
    public void close() {
        parent.getChildren().remove(canvas);
        canvas.widthProperty().unbind();
        canvas.heightProperty().unbind();
    }

    /**
     * 只支持Wave文件的读取和绘制
     *
     * @param audioFile 音频文件
     */
    public abstract void draw(AudioFile audioFile);

    /**
     * 取消绘制，子类需要实现该方法来停止绘制过程。
     */
    public abstract void cancel();

    /**
     * 插件视图
     *
     * @param parent 父容器
     *
     * @return 插件视图
     */
    @Override
    public Pane view(Pane parent) {
        return null;
    }
}